 /* @description:nginx 对 动态数组的封装
  *  			 支持的接口: 动态数组的创建接口
  *							 动态数组的销毁接口
  *							 动态数组初始化接口
  *						  		
  *
  *
  *
  *
  *
  * Copyright (C) Igor Sysoev
  * Copyright (C) Nginx, Inc.
  */


#ifndef _NGX_ARRAY_H_INCLUDED_
#define _NGX_ARRAY_H_INCLUDED_


#include <ngx_config.h>
#include <ngx_core.h>


/*
 *@brief:动态数组的结构体定义
 *
 */
typedef struct {
    void        *elts;  //动态数组的首地址 
    ngx_uint_t   nelts;  //当前动态数组已经存储了多少个元素
    size_t       size;  //每个数组元素的大小
    ngx_uint_t   nalloc; //当前动态数组的大小
    ngx_pool_t  *pool; //所属的内存池 
} ngx_array_t;


/*@description:
 *@动态数组创建
 *@动态数组销毁
 *@动态数组扩展 
*/
ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);
void ngx_array_destroy(ngx_array_t *a);
void *ngx_array_push(ngx_array_t *a);
void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n);

/*
 *@brief:动态数组的初始化
 *@para: ngx_array_t *array: 动态数组的上下文
 *       ngx_pool_t *pool: 所在内存池
 *       ngx_uint_t n: 数组多少个
 *		 size_t size: 数组每个元素占用的空间大小
 *@return value:
 */
static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)
{
    /*
     * set "array->nelts" before "array->elts", otherwise MSVC thinks
     * that "array->nelts" may be used without having been initialized
     */

    array->nelts = 0; //已经使用了多少个元素
    array->size = size; //每个元素的大小
    array->nalloc = n;  //一共多少个元素
    array->pool = pool;  //所在内存池  

    array->elts = ngx_palloc(pool, n * size); //申请内存空间 
    if (array->elts == NULL) {
        return NGX_ERROR;
    }
    return NGX_OK;
}


#endif /* _NGX_ARRAY_H_INCLUDED_ */
